/*
editeur.c
---------

Par mateo21, pour Le Site du Zér0 (www.siteduzero.com)

Rôle : gestion de l'éditeur de niveaux.
*/

#include <stdlib.h>
#include <stdio.h>
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include <SDL/SDL_ttf.h>

#include "constantes.h"
#include "editeur.h"
#include "fichiers.h"
void editeur(SDL_Surface * ecran, int level)
{
    SDL_Surface *mur = NULL, *caisse = NULL, *objectif = NULL, *luigi =
	NULL, *caisseactive = NULL, *imactuelle = NULL;
    SDL_Rect position;
    SDL_Rect positionim;
#ifndef _PSP_FW_VERSION
    SDL_Event event;
    int clicGaucheEnCours = 0, clicDroitEnCours = 0;
    int objetActuel = MUR;
#endif
    int continuer = 1, i = 0, j = 0;
    int carte[NB_BLOCS_LARGEUR][NB_BLOCS_HAUTEUR] = {{ 0 }};

    // Chargement des objets et du niveau
    mur = IMG_Load("mur.jpg");
    caisse = IMG_Load("caisse.jpg");
    caisseactive = IMG_Load("caisseactive.jpg");
    objectif = IMG_Load("objectif.gif");
    luigi = IMG_Load("luigiface.gif");
    imactuelle = mur;
    if (!chargerNiveau(carte, level))
	exit(EXIT_FAILURE);

    // Boucle infinie de l'éditeur
    while (continuer) {
#ifndef _PSP_FW_VERSION
	SDL_WaitEvent(&event);
	switch (event.type) {
	case SDL_QUIT:
	    continuer = 0;
	    break;
	case SDL_MOUSEBUTTONDOWN:
	    if (event.button.button == SDL_BUTTON_LEFT) {

		// On met l'objet actuellement choisi (mur, caisse...) à l'endroit du clic
		carte[event.button.x / TAILLE_BLOC][event.button.y /
						    TAILLE_BLOC] =
		    objetActuel;
		clicGaucheEnCours = 1;	// On active un booléen pour retenir qu'un bouton est enfoncé
	    }

	    else if (event.button.button == SDL_BUTTON_RIGHT)	// Le clic droit sert à effacer
	    {
		carte[event.button.x / TAILLE_BLOC][event.button.y /
						    TAILLE_BLOC] = VIDE;
		clicDroitEnCours = 1;
	    }
	    break;
	case SDL_MOUSEBUTTONUP:	// On désactive le booléen qui disait qu'un bouton était enfoncé
	    if (event.button.button == SDL_BUTTON_LEFT)
		clicGaucheEnCours = 0;

	    else if (event.button.button == SDL_BUTTON_RIGHT)
		clicDroitEnCours = 0;
	    break;
	case SDL_MOUSEMOTION:
	    if (objetActuel != VIDE) {

		//Deplacement sous curseur
		positionim.x = event.motion.x;
		positionim.y = event.motion.y;
		SDL_BlitSurface(imactuelle, NULL, ecran, &positionim);
	    }
	    if (clicGaucheEnCours)	// Si on déplace la souris et que le bouton gauche de la souris est enfoncé
	    {
		carte[event.motion.x / TAILLE_BLOC][event.motion.y /
						    TAILLE_BLOC] =
		    objetActuel;
	    }

	    else if (clicDroitEnCours)	// Pareil pour le bouton droit de la souris
	    {
		carte[event.motion.x / TAILLE_BLOC][event.motion.y /
						    TAILLE_BLOC] = VIDE;
	    }
	    break;
	case SDL_KEYDOWN:
	    switch (event.key.keysym.sym) {
	    case SDLK_ESCAPE:
		continuer = 0;
		break;
	    case SDLK_s:
		sauvegarderNiveau(carte, level);
		break;
	    case SDLK_c:
		chargerNiveau(carte, level);
		break;
	    //case SDLK_1:
	    case SDLK_a:
		objetActuel = MUR;
		imactuelle = mur;
		break;
	    //case SDLK_2:
	    case SDLK_z:
		objetActuel = CAISSE;
		imactuelle = caisse;
		break;
	    //case SDLK_3:
	    case SDLK_e:
		objetActuel = OBJECTIF;
		imactuelle = objectif;
		break;
	    //case SDLK_5:
	    case SDLK_r:
		objetActuel = LUIGI;
		imactuelle = luigi;
		break;
	    //case SDLK_4:
	    case SDLK_t:
		objetActuel = CAISSE_OK;
		imactuelle = caisseactive;
		break;
	    case SDLK_UP:
		continuer = 0;
		editeur(ecran, level + 1);
		break;
	    case SDLK_DOWN:
		if (level == 1)
		    break;
		continuer = 0;
		editeur(ecran, level - 1);
		break;
		break;
	    default:
		break;
	    }
	    break;
	}
#endif

	// Effacement de l'écran
	SDL_FillRect(ecran, NULL,
		     SDL_MapRGB(ecran->format, 255, 255, 255));

	// Placement des objets à l'écran
	for (i = 0; i < NB_BLOCS_LARGEUR; i++) {
	    for (j = 0; j < NB_BLOCS_HAUTEUR; j++) {
		position.x = i * TAILLE_BLOC;
		position.y = j * TAILLE_BLOC;
		switch (carte[i][j]) {
		case MUR:
		    SDL_BlitSurface(mur, NULL, ecran, &position);
		    break;
		case CAISSE:
		    SDL_BlitSurface(caisse, NULL, ecran, &position);
		    break;
		case OBJECTIF:
		    SDL_BlitSurface(objectif, NULL, ecran, &position);
		    break;
		case LUIGI:
		    SDL_BlitSurface(luigi, NULL, ecran, &position);
		    break;
		case CAISSE_OK:
		    SDL_BlitSurface(caisseactive, NULL, ecran, &position);
		}
	    }
	}
	SDL_BlitSurface(imactuelle, NULL, ecran, &positionim);

	// Mise à jour de l'écran
	SDL_Flip(ecran);
    }
    SDL_FreeSurface(mur);
    SDL_FreeSurface(caisse);
    SDL_FreeSurface(objectif);
    SDL_FreeSurface(luigi);
}
